package class01;

/**
 * @description: 打印一个数的二进制
 * @time: 2021/7/2 11:05
 * @author: lhy
 */
public class PrintBinary {
    public static void print(int num){
        for (int i = 31; i >= 0; i--) {
            System.out.print((num & (1 << i)) == 0 ? '0' : '1');
        }
        System.out.println();
    }
    public static void main(String[] args) {
        /*
         * Java底层 数如何表示的？
         * 一共32位信息，最高位作为符号位，1代表负数，0代表正数
         * 正数的范围是1 ~ 2^31 - 1   为什么 -1 ，因为 0 定义在了非负数里面
         * 负数的范围是-1 ~ -2^31
         * 负数如何表示的？最高位余下的位数 取反＋1
         *      比如-1的二进制是：11111111111111111111111111111111
         *      最高位是1，因此为负数，~(1111111111111111111111111111111) + 1 的十进制正好是 1
         *      所以 11111111111111111111111111111111 表示 -1
         * 问题：
         *      为什么要将负数的表示形式搞的这么复杂？
         * 原因：
         *      在计算机的底层，+ - * / % 等运算都是用 | & ^ ~ 定义的，由于在运算过程中有正有负，
         *      为了在底层只分别定义一套逻辑，提升运算效率，所以定义的这么奇葩。
         *
         */
        System.out.print("1的二进制：");
        print(1);
        System.out.print("-1的二进制：");
        print(-1);
        int max = Integer.MAX_VALUE;
        int min = Integer.MIN_VALUE;
        System.out.print("Java系统最大值的二进制：");
        print(max);
        System.out.print("Java系统最小值的二进制：");
        print(min);
        int a = 37438724;
        int b = 94954985;
        System.out.print("  a  ：");
        print(a);
        System.out.print("  b  ：");
        print(b);
        System.out.print("a | b：");
        print(a | b);
        System.out.print("a & b：");
        print(a & b);
        System.out.print("a ^ b：");
        print(a ^ b);

        /*  >> 带符号右移
         *  >>> 不带符号右移
         *
         */
        System.out.print("   1024   ：");
        print(1024);
        System.out.print("1024 >> 1 : ");
        print(1024 >> 1);
        System.out.print("1024 >>> 1: ");
        print(1024 >>> 1);

        System.out.print("   min:   ");
        print(min);
        // 带符号右移
        System.out.print("min >> 1: ");
        print(min >> 1);
        // 不带符号右移
        System.out.print("min >>> 1:");
        print(min >>> 1);

        /*
         * 如何表示一个数的相反数
         * 1）  int c = 5;
         *      int d = -5;
         * 2)   int d2 = ~c + 1;
         * ∴ ~N + 1 = -N
         */
        int c = 5;
        System.out.print("5的相反数：");
        System.out.println(-c);
        System.out.print("5的相反数'：");
        int d = ~c + 1;
        System.out.println(d);
        System.out.println("why?");
        print(c);
        print(~c);
        print(d);
        System.out.println("系统最小值取反+1会是什么？");
        System.out.println(min);
        System.out.println(~min+1);
        print(min);
        print(~min + 1);
//        print();
    }
}
